home *** CD-ROM | disk | FTP | other *** search
/ The Arsenal Files 8 / The Arsenal Files Collection #8 (Arsenal Computer) (1996).ISO / g_quake / dropde-2.zip / MONSTERS.QC < prev    next >
Text File  |  1996-09-20  |  7KB  |  322 lines

  1. /* ALL MONSTERS SHOULD BE 1 0 0 IN COLOR */
  2.  
  3. // name =[framenum,    nexttime, nextthink] {code}
  4. // expands to:
  5. // name ()
  6. // {
  7. //        self.frame=framenum;
  8. //        self.nextthink = time + nexttime;
  9. //        self.think = nextthink
  10. //        <code>
  11. // };
  12.  
  13.  
  14. /*
  15. ================
  16. monster_use
  17.  
  18. Using a monster makes it angry at the current activator
  19. ================
  20. */
  21. void() monster_use =
  22. {
  23.     if (self.enemy)
  24.         return;
  25.     if (self.health <= 0)
  26.         return;
  27.     if (activator.items & IT_INVISIBILITY)
  28.         return;
  29.     if (activator.flags & FL_NOTARGET)
  30.         return;
  31.     if (activator.classname != "player")
  32.         return;
  33.     
  34. // delay reaction so if the monster is teleported, its sound is still
  35. // heard
  36.     self.enemy = activator;
  37.     self.nextthink = time + 0.1;
  38.     self.think = FoundTarget;
  39. };
  40.  
  41.  
  42. void() SUB_Gib =
  43. {
  44.     local vector x, y, v;
  45.     local float r_num;
  46.     r_num = random();
  47.     if (r_num < 0.5)
  48.     {
  49.         x = '1 0 0';
  50.         y = '0 1 0';
  51.         v = x * (50 - random() * 100) + y * (50 - random() * 100);
  52.         SpawnMeatSpray(self.origin, v);
  53.     }
  54.     else if (self.flags & FL_ONFIRE)
  55.         return;
  56.     else if (r_num < 0.7)
  57.         ThrowGib("progs/gib1.mdl", self.health);
  58.     else if (r_num < 0.9)
  59.         ThrowGib("progs/gib2.mdl", self.health);
  60.     else
  61.         ThrowGib("progs/gib3.mdl", self.health);
  62. };
  63.  
  64. void() MonsterCorpseGib =
  65. {
  66.     ThrowGib ("progs/gib3.mdl", self.health);
  67.     ThrowGib ("progs/gib3.mdl", self.health);
  68.     ThrowGib ("progs/gib3.mdl", self.health);
  69.     ThrowHead (self.weaponmodel, self.health);
  70.     self.think = SUB_Null;
  71.     self.nextthink = -1;
  72. };
  73.  
  74.  
  75. void() FallingCorpse =
  76. {
  77.     if (self.origin == self.oldorigin)
  78.     {
  79.         droptofloor();
  80.         if (self.groundentity == world)
  81.         {
  82.             self.nextthink = -1;
  83.             return;
  84.         }
  85.     }
  86.     self.oldorigin = self.origin;
  87.     self.think = FallingCorpse;
  88.     self.nextthink = time + 0.5;
  89. };
  90.  
  91.  
  92. void() DropCorpse =
  93. {
  94.     self.oldorigin = self.origin;
  95.     self.think = FallingCorpse;
  96.     self.nextthink = time + 0.25;
  97. };
  98.  
  99.  
  100. void(vector bb1, vector bb2, string headmdl) monster_corpse_setup =
  101. {
  102.     self.deadflag = DEAD_DEAD;
  103.     if (!solid_corpse)
  104.     {
  105.         self.solid = SOLID_NOT;
  106.         return;
  107.     }
  108.     setsize(self, bb1, bb2);
  109.     self.weaponmodel = headmdl; // This should be unused in monsters
  110.     self.health = 35;
  111.     self.solid = SOLID_SLIDEBOX;
  112.     self.movetype = MOVETYPE_BOUNCE;
  113.     self.th_stand = SUB_Null;
  114.     self.th_walk = SUB_Null;
  115.     self.th_run = SUB_Null;
  116.     self.th_pain = SUB_Gib;
  117.     self.th_die = MonsterCorpseGib;
  118.     self.th_melee = SUB_Null;
  119.     self.th_missile = SUB_Null;
  120.     self.takedamage= DAMAGE_AIM; // grenades explode 
  121.  
  122.     DropCorpse();
  123. };
  124.  
  125.  
  126. /*
  127. ================
  128. monster_death_use
  129.  
  130. When a monster dies, it fires all of its targets with the current
  131. enemy as activator.
  132. ================
  133. */
  134. void() monster_death_use =
  135. {
  136.     local entity     ent, otemp, stemp;
  137.  
  138. // fall to ground
  139.     if (self.flags & FL_FLY)
  140.         self.flags = self.flags - FL_FLY;
  141.     if (self.flags & FL_SWIM)
  142.         self.flags = self.flags - FL_SWIM;
  143.  
  144.     if (!self.target)
  145.         return;
  146.  
  147.     activator = self.enemy;
  148.     SUB_UseTargets ();
  149. };
  150.  
  151.  
  152. //============================================================================
  153.  
  154. void() walkmonster_start_go =
  155. {
  156. local string    stemp;
  157. local entity    etemp;
  158.  
  159.     self.origin_z = self.origin_z + 1;    // raise off floor a bit
  160.     droptofloor();
  161.     
  162.     if (!walkmove(0,0))
  163.     {
  164.         dprint ("walkmonster in wall at: ");
  165.         dprint (vtos(self.origin));
  166.         dprint ("\n");
  167.     }
  168.     
  169.     self.takedamage = DAMAGE_AIM;
  170.  
  171.     self.ideal_yaw = self.angles * '0 1 0';
  172.     if (!self.yaw_speed)
  173.         self.yaw_speed = 20;
  174.     self.view_ofs = '0 0 25';
  175.     self.use = monster_use;
  176.     
  177.     self.flags = self.flags | FL_MONSTER;
  178.     
  179.     if (self.target)
  180.     {
  181.         self.goalentity = self.movetarget = find(world, targetname, self.target);
  182.         self.ideal_yaw = vectoyaw(self.goalentity.origin - self.origin);
  183.         if (!self.movetarget)
  184.         {
  185.             dprint ("Monster can't find target at ");
  186.             dprint (vtos(self.origin));
  187.             dprint ("\n");
  188.         }
  189. // this used to be an objerror
  190.         if (self.movetarget.classname == "path_corner")
  191.             self.th_walk ();
  192.         else
  193.             self.pausetime = 99999999;
  194.             self.th_stand ();
  195.     }
  196.     else
  197.     {
  198.         self.pausetime = 99999999;
  199.         self.th_stand ();
  200.     }
  201.  
  202. // spread think times so they don't all happen at same time
  203.     self.nextthink = self.nextthink + random()*0.5;
  204. };
  205.  
  206.  
  207. void() walkmonster_start =
  208. {
  209. // delay drop to floor to make sure all doors have been spawned
  210. // spread think times so they don't all happen at same time
  211.     self.nextthink = self.nextthink + random()*0.5;
  212.     self.think = walkmonster_start_go;
  213.     total_monsters = total_monsters + 1;
  214. };
  215.  
  216.  
  217.  
  218. void() flymonster_start_go =
  219. {
  220.     self.takedamage = DAMAGE_AIM;
  221.  
  222.     self.ideal_yaw = self.angles * '0 1 0';
  223.     if (!self.yaw_speed)
  224.         self.yaw_speed = 10;
  225.     self.view_ofs = '0 0 25';
  226.     self.use = monster_use;
  227.  
  228.     self.flags = self.flags | FL_FLY;
  229.     self.flags = self.flags | FL_MONSTER;
  230.  
  231.     if (!walkmove(0,0))
  232.     {
  233.         dprint ("flymonster in wall at: ");
  234.         dprint (vtos(self.origin));
  235.         dprint ("\n");
  236.     }
  237.  
  238.     if (self.target)
  239.     {
  240.         self.goalentity = self.movetarget = find(world, targetname, self.target);
  241.         if (!self.movetarget)
  242.         {
  243.             dprint ("Monster can't find target at ");
  244.             dprint (vtos(self.origin));
  245.             dprint ("\n");
  246.         }
  247. // this used to be an objerror
  248.         if (self.movetarget.classname == "path_corner")
  249.             self.th_walk ();
  250.         else
  251.             self.pausetime = 99999999;
  252.             self.th_stand ();
  253.     }
  254.     else
  255.     {
  256.         self.pausetime = 99999999;
  257.         self.th_stand ();
  258.     }
  259. };
  260.  
  261. void() flymonster_start =
  262. {
  263. // spread think times so they don't all happen at same time
  264.     self.nextthink = self.nextthink + random()*0.5;
  265.     self.think = flymonster_start_go;
  266.     total_monsters = total_monsters + 1;
  267. };
  268.  
  269.  
  270. void() swimmonster_start_go =
  271. {
  272.     if (deathmatch < 3)
  273.     {
  274.         remove(self);
  275.         return;
  276.     }
  277.  
  278.     self.takedamage = DAMAGE_AIM;
  279.     total_monsters = total_monsters + 1;
  280.  
  281.     self.ideal_yaw = self.angles * '0 1 0';
  282.     if (!self.yaw_speed)
  283.         self.yaw_speed = 10;
  284.     self.view_ofs = '0 0 10';
  285.     self.use = monster_use;
  286.     
  287.     self.flags = self.flags | FL_SWIM;
  288.     self.flags = self.flags | FL_MONSTER;
  289.  
  290.     if (self.target)
  291.     {
  292.         self.goalentity = self.movetarget = find(world, targetname, self.target);
  293.         if (!self.movetarget)
  294.         {
  295.             dprint ("Monster can't find target at ");
  296.             dprint (vtos(self.origin));
  297.             dprint ("\n");
  298.         }
  299. // this used to be an objerror
  300.         self.ideal_yaw = vectoyaw(self.goalentity.origin - self.origin);
  301.         self.th_walk ();
  302.     }
  303.     else
  304.     {
  305.         self.pausetime = 99999999;
  306.         self.th_stand ();
  307.     }
  308.  
  309. // spread think times so they don't all happen at same time
  310.     self.nextthink = self.nextthink + random()*0.5;
  311. };
  312.  
  313. void() swimmonster_start =
  314. {
  315. // spread think times so they don't all happen at same time
  316.     self.nextthink = self.nextthink + random()*0.5;
  317.     self.think = swimmonster_start_go;
  318.     total_monsters = total_monsters + 1;
  319. };
  320.  
  321.  
  322.